import request from '@/utils/request';
import { API_MAP } from '@/utils/url';
import { AxiosProgressEvent } from 'axios';
import { formatData, getLastQaIndex, scrollToBottom } from '@/utils/index';
import { AnswerType } from '@/utils/constant';
import { marked } from 'marked';
import store from '@/store';
import { OllamaMessages, OllamaTag } from '@/interface/home';

/**
 * @description 聊天接口
 * @param {OllamaMessages[]} ollamaMessages 聊天请求参数
 * @param {number} refreshIndex 刷新索引
 * @returns void
 */
export const ollamaChat = async (ollamaMessages: OllamaMessages[], refreshIndex?: number): Promise<void> => {
  // 发送请求到服务器，并处理响应
  return await request.post(
    API_MAP.chat,
    { model: store.state.ollamaModel, messages: ollamaMessages },
    {
      headers: {
        Accept: 'application/x-ndjson',
      },
      // 处理下载进度事件，用于接收流式响应
      onDownloadProgress: (progressEvent: AxiosProgressEvent): void => {
        const xhr = progressEvent.event;
        const responseText = xhr.target.responseText;
        const data = responseText.split('\n').filter((item: string) => item !== '');
        const answer = formatData(data);
        const index = refreshIndex || getLastQaIndex(AnswerType.BOT);
        const qa = { answerType: AnswerType.BOT, answer: marked(answer) };
        // 更新消息列表中的机器人回答
        store.commit('updateMessages', { message: qa, index: index !== -1 ? index : undefined });
        // 滚动到消息列表的底部
        scrollToBottom();
      },
    },
  );
};

/**
 * @description 异步获取模型列表
 * 该函数使用 request 库发送 GET 请求到 API_MAP.models 定义的 API 端点，
 * 并处理返回的数据，将其映射为仅包含 name 和 model 属性的 OllamaTag 对象数组。
 * @returns {Promise<OllamaTag[]>} 返回一个解析为 OllamaTag 对象数组的 Promise
 */
export const getOllamaModel = async (): Promise<OllamaTag[]> => {
  // 发送 GET 请求以获取模型数据
  const { data } = await request.get(API_MAP.models);
  // 映射获取的数据，将每个项目转换为仅包含 name 和 model 的对象，并返回此数组
  return data.models.map((item: OllamaTag) => ({ name: item.name, model: item.model }));
};
